package com.geek.boot.config;

import com.geek.boot.entity.Car;
import com.geek.boot.entity.Person;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author chenmin
 * @desc TODO
 * @date 2025/7/12
 *
 * 注解 @Configuration
 *   1.本质上就是@Component注解，会将当前类自动注册至IOC容器中
 *   2.标识当前类是一个配置类
 *   3.proxyBeanMethods属性
 *      3.1 proxyBeanMethods = true 默认
 *          - Full模式  全模式，来检测当前IOC中是否存在此实例，若存在则不会再创建，直接取到单实例进行装配
 *          - CGLIB动态代理 com.geek.boot.config.MyConfig1$$EnhancerBySpringCGLIB$$f8bd47a5@7c8326a4
 *      3.2 proxyBeanMethods = false
 *          - Lite模式  轻模式，不再检测，直接每次调用返回新的对象
 *          - 目标对象  com.geek.boot.config.MyConfig1@a619c2
 *
 * 使用场景
 * 1.Lite模式  配置类组件之间无依赖关系用Lite模式加速容器启动过程，减少判断配置
 * 2.Full模式（默认）  类组件之间有依赖关系，方法会被调用得到之前单实例组件
 *
 * 注解 @Bean
 *  1.@Bean 将当前方法的返回值注册至IOC容器中，默认命名策略 beanName就是方法名
 *  2.@Bean(value="xxx")  将beanName指定为当前的value值
 *
 */
@Configuration(proxyBeanMethods = true)
public class MyConfig1 {

    @Bean
    public Person p1(){
        return new Person("李四" , 23 , car());
    }

    @Bean
    public Person p2(){
        return new Person("张三" , 28 , car());
    }

    /*@Bean
    public Person p2(){
        //builder 构建对象
        return Person.builder().name("张三").age(28).build();
    }*/

    @Bean
    public Car car(){
        return new Car("大奔" , 500000);
    }
}
